package API_Systeme;

import domain.Utilisateur;
import API_Db.*;
import java.sql.Timestamp;

/**
 * @author Wan
 */
public class API_Systeme_Utilisateur
{

    /**
     * Instance de API_Db_Utilisateur
     */
    private IAPI_Db_Utilisateur api_db_u = new API_Db_Utilisateur();

    /**
     * Inscription de l utilisateur dans le systeme
     * @param u Future utilisateur
     * @throws Exception 
     */
    public void inscrire(Utilisateur u) throws Exception
    {
        testExisteUtilisateur(u, -1);

        u.setActif(Utilisateur.ATTENTE_CONFIRMATION);
        int id = api_db_u.inscrireDB(u);

        if (id == 0)
        {
            throw new Exception("Erreur lors de l'insertion");
        }
        u.setIdUtilisateur(id);
        activerProfil(id);
        //envoyerMail(u, Email.ACTIVATION);
    }

    /**
     * Fonction d identification de l utilisateur
     * @param login
     * @param mdp
     * @return L objet utilisateur qui vient de se connecter
     * @throws Exception 
     */
    public Utilisateur identifier(String login, String mdp) throws Exception
    {
        Utilisateur u = api_db_u.identifierDB(login, mdp);
        if (u == null)
        {
            throw new Exception("Combinaison e-mail mot de passe incorrect");
        }
        if (u.getActif() == Utilisateur.ATTENTE_CONFIRMATION)
        {
            throw new Exception("Veuillez confirmer votre compte avec le lien envoyé par mail");
        }
        if (u.getActif() == Utilisateur.INACTIF)
        {
            throw new Exception("Votre compte a été supprimé");
        }
        return u;

    }

    /**
     * Activation du profil
     * @param id_util
     * @throws Exception 
     */
    public void activerProfil(int id_util) throws Exception
    {
        if (api_db_u.changeEtatUtilisateurDB(id_util, Utilisateur.ACTIF) == 0)
        {
            throw new Exception("L'utilisateur n'exite pas dans le systeme");
        }
        api_db_u.creerCompteDB(id_util);
    }

    /**
     * Modification du profil utilisateur
     * @param Utilisateur u
     * @throws Exception 
     */
    public void modifierProfil(Utilisateur u) throws Exception
    {
        testExisteUtilisateur(u, u.getIdUtilisateur());
        api_db_u.modifierProfilDB(u);
    }

    /**
     * Modification de la date de derniere connexion
     * @param u
     * @throws Exception 
     */
    public void deconnecter(Utilisateur u) throws Exception
    {
        Timestamp t = new Timestamp(new java.util.Date().getTime());
        u.setDateDerniereConnexion(t);
        if (api_db_u.majDateDerniereConnexionDB(u) == 0)
        {
            throw new Exception("Erreur de requête de maj de la date de dernière connexion");
        }
    }

    /**
     * Fonction de recuperation du mot de passe
     * @param mail
     * @throws Exception 
     */
    public void recupererMdp(String mail) throws Exception
    {
        Utilisateur u = api_db_u.recupererMotDePass(mail);
        if (u == null)
        {
            throw new Exception("Cet email n'existe pas dans le sytème");
        }
        else
        {
            //envoyerMail(u, Email.RECUPERER_MDP);
        }
    }

    /**
     * Changement de l etat de l utilisateur Permet egalement de desactive/supprimer le compte utilisateur
     * @param id_utilisateur
     * @param etat
     */
    public void changerEtatUtil(int id_utilisateur, int etat) throws Exception
    {
        api_db_u.changeEtatUtilisateurDB(id_utilisateur, etat);
    }

    /**
     * Envoi d un mail a l utilisateur
     * @param u
     * @param type_message 
     */
    public void envoyerMail(Utilisateur u, int type_message)
    {
        //Email email = new Email();
        //email.envoyerMail(u, type_message);
    }

    /**
     * Test si le login et l email existent deja dans le systeme
     * @param u
     * @param id_utilisateur
     * @throws Exception 
     */
    public void testExisteUtilisateur(Utilisateur u, int id_utilisateur) throws Exception
    {
        if (api_db_u.emailExiste(u.getEmail(), id_utilisateur))
        {
            throw new Exception("L'email existe déjà dans le système");
        }

        if (api_db_u.loginExiste(u.getLogin(), id_utilisateur))
        {
            throw new Exception("Le login est déjà utilisé");
        }
    }

    public void supprimerUtilisateur(String nom, String prenom, String codeBanque, String codeGuichet, String numCompte, String cleRib, int id_utilisateur) throws Exception
    {
        if (api_db_u.estMeilleurEncherisseur(id_utilisateur))
        {
            throw new Exception("L'utilisateur est le meilleur encherisseur sur une séance");
        }
        else
        {
            if (api_db_u.estVendeurEnCours(id_utilisateur))
            {
                throw new Exception("L'utilisateur est le vendeur d'une seance en cours ou pré-ouverte");
            }
        }
        API_Systeme_Compte API_Sys_compte = new API_Systeme_Compte();
        API_Sys_compte.cloturerCompte(nom, prenom, codeBanque, codeGuichet, numCompte, cleRib, id_utilisateur);
        changerEtatUtil(id_utilisateur, Utilisateur.INACTIF);
    }
}
